import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import numpy as np

# ✅ 解决中文显示问题
plt.rcParams["axes.unicode_minus"] = False   # 解决负号问题

# ✅ 自动加载系统中的中文字体
font_path = fm.findSystemFonts(fontpaths=["C:/Windows/Fonts"], fontext='ttf')
if font_path:
    my_font = fm.FontProperties(fname=font_path[0])
    plt.rcParams["font.family"] = my_font.get_name()

sns.set_theme(style="darkgrid")

# 📊 载入 Seaborn 内置数据集
tips = sns.load_dataset("tips")

# 🎨 创建子图
fig, axs = plt.subplots(2, 3, figsize=(18, 12))

# 📈 1️⃣ 散点图
sns.scatterplot(x="total_bill", y="tip", hue="day", size="size", data=tips, ax=axs[0, 0])
axs[0, 0].set_title("散点图：账单金额 vs 小费")

# 📊 2️⃣ 直方图
sns.histplot(tips["total_bill"], bins=20, kde=True, ax=axs[0, 1])
axs[0, 1].set_title("直方图：账单金额分布")

# 📦 3️⃣ 箱型图
sns.boxplot(x="day", y="total_bill", data=tips, ax=axs[0, 2])
axs[0, 2].set_title("箱型图：每日账单金额")

# 📊 4️⃣ 计数图
sns.countplot(x="day", data=tips, ax=axs[1, 0])
axs[1, 0].set_title("计数图：不同星期的订单数量")

# 📈 5️⃣ 回归分析
sns.regplot(x="total_bill", y="tip", data=tips, ax=axs[1, 1])
axs[1, 1].set_title("回归分析：账单金额 vs 小费")

# 🔥 6️⃣ 相关性热图
numeric_tips = tips.select_dtypes(include=['number'])
corr = numeric_tips.corr()
sns.heatmap(corr, annot=True, cmap="coolwarm", linewidths=0.5, ax=axs[1, 2])
axs[1, 2].set_title("变量相关性热图")

# 📁 保存图片
plt.tight_layout()
plt.savefig("seaborn_plot.png", dpi=300)
plt.show()

#成对变量关系可视化
# sns.pairplot(tips, vars=["total_bill", "tip", "size"], hue="sex")
# #vars=["total_bill", "tip", "size"]：只展示 部分变量的关系；hue="sex"：按 性别（男/女）区分颜色。
# plt.show()
